package com.nxy.cpfsfe.busi.btmgtsk;

import com.adtec.starring.exception.BaseException;
import com.adtec.starring.util.SpringUtil;
import com.nxy.cpfsfe.busi.btmgtsk.endd.NCSEndDChkASrv;
import com.nxy.cpfsfe.enumtype.RespCd;
import com.nxy.cpfsfe.mybatis.mapper.ToBizSysMapper;
import com.nxy.cpfsfe.mybatis.mapper.TrChlBizTypMapper;
import com.nxy.cpfsfe.mybatis.mapper.TrSysBizTypMapper;
import com.nxy.cpfsfe.mybatis.pojo.TrSysBizTyp;
import com.nxy.cpfsfe.util.DateUtil;
import org.apache.ibatis.session.SqlSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Date;
import java.util.List;

public class BTmgEndDChkATaskBean {
	
	private static final Logger LOGGER = LoggerFactory.getLogger(BTmgEndDChkATaskBean.class);
	
	public static void timeTask(Date chkAD,String starringModelNm){

		LOGGER.info("当前时间：[{}]，开始执行[{}]日的日终生成对账文件定时任务",DateUtil.date2Str(new Date()),DateUtil.date3Str(chkAD));
		
		SqlSession sqlSession = (SqlSession) SpringUtil.getBean("mybatisSqlSession");
		
		//查询所有启用的业务系统，以及其开通的通道
		ToBizSysMapper toBizSysMapper = sqlSession.getMapper(ToBizSysMapper.class);
		TrSysBizTypMapper trSysBizTypMapper = sqlSession.getMapper(TrSysBizTypMapper.class);
		TrChlBizTypMapper trChlBizTypMapper = sqlSession.getMapper(TrChlBizTypMapper.class);
		
		List<String> bizSysIds = toBizSysMapper.queryAllEnbBizSys();
		if(bizSysIds != null && bizSysIds.size() > 0){
			for(String bizSysId : bizSysIds){
				List<TrSysBizTyp> trSysBizTyps = trSysBizTypMapper.queryOrgIdByBizSysId(bizSysId);
				if(trSysBizTyps != null && trSysBizTyps.size() > 0){
					List<String> pCIds = trChlBizTypMapper.queryOpenChlByOrgId(trSysBizTyps);
					if(pCIds != null && pCIds.size() > 0){
						for(String pCId : pCIds){
							try{
								if("NCS".equals(pCId)){
									new NCSEndDChkASrv(bizSysId,pCId,chkAD,starringModelNm).endDChkAProcess();
								}else{
									String errMsg = String.format("当前系统不支持[%s]通道的对账文件生成",pCId);
									throw new BaseException(RespCd.NCPS2001,errMsg);
								}
							}catch(BaseException e){
								String errorMsg = String.format("[%s]日，日终生成对账文件定时任务失败记录，错误码:%s,错误信息:%s",DateUtil.date3Str(chkAD),e.getErrorCode(),e.getErrorDesc());

								if(e.getErrorCode().equals(RespCd.NCPO0001) || e.getErrorCode().equals(RespCd.NCPO6410)){
									LOGGER.warn(errorMsg);
								}else{
									LOGGER.error(errorMsg,e);
								}
							}catch(Throwable e){
								String errorMsg = String.format("[%s]日，日终生成对账文件定时任务在生成业务系统[%s]的[%s]通道[%s]日的对账文件时发生未知异常",DateUtil.date3Str(chkAD),bizSysId,pCId,DateUtil.date3Str(chkAD));
								LOGGER.error(errorMsg,e);
							}	
						}
					}else{
						String errorMsg = String.format("[%s]日，日终生成对账文件定时任务失败记录，业务系统[%s]的机构未开通任何通道", DateUtil.date3Str(chkAD),bizSysId);
						LOGGER.error(errorMsg);
					}
				}else{
					String errorMsg = String.format("[%s]日，日终生成对账文件定时任务失败记录，业务系统[%s]未配置任何机构", DateUtil.date3Str(chkAD),bizSysId);
					LOGGER.error(errorMsg);
				}
			}
		}else{
			String errorMsg = String.format("[%s]日，日终生成对账文件定时任务执行失败，无启用状态的业务系统", DateUtil.date3Str(chkAD));
			LOGGER.error(errorMsg);
		}
		
		LOGGER.info("[{}]日，日终生成对账文件定时任务执行完毕",DateUtil.date3Str(chkAD));
		
	}

}
